import { loginAPI, getUserInfoAPI, getUserPhotoAPI } from '@/api'
import { getToken, setToken, removeToken } from '@/utils/auth'
import { resetRouter } from '@/router'
const getDefaultState = () => {
  return {
    token: getToken(), // 初始值，默认从本地取(优先从本地取，本地是持久化的，这样刷新默认去本地取一个)
    userInfo: {}, // 保存用户基本资料的对象
    name: '',
    avatar: ''
  }
}

const state = getDefaultState()

const mutations = {
  // 初始化state---清空token(vuex和本地)和用户信息
  RESET_STATE: (state) => {
    Object.assign(state, getDefaultState())
    removeToken()
  },
  SET_TOKEN: (state, token) => {
    state.token = token // 给vuex里state存一份token
    setToken(token) // 再给也本地存一份token
  },
  SET_NAME: (state, name) => {
    state.name = name
  },
  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar
  },
  // 删除token
  REMOVE_TOKEN(state) {
    state.token = ''
    removeToken()
  },
  // 操作userInfo用户信息这个变量
  SET_USER(state, value) { // value->一会请求到的用户信息对象
    state.userInfo = value // 把它接到的这个变量给上面state里面的userInfo
  },
  // 删除用户信息
  REMOVE_USER(state, value) {
    state.userInfo = {}
  }
}

const actions = {
  // 封装的登录页面的调接口
  // actions语法看一下，第一个参数是store
  async loginActions({ commit }, data) {
    const res = await loginAPI(data)
    console.log(res)
    // console.log(res.data) // 登录后拿到后台返回的token
    commit('SET_TOKEN', res.data) // 当前在模块内，不需要加模块名了，把拿到的token提交给mutations，保存在state里，mutations里同时也给本地存里一份
    return res // 把返回的结果给调用处
    // async函数return的值，都会作为Promise成功的结果
    // 只要不是Promise.reject()，都是成功的值
  },
  // 封装-获取用户基本信息
  async getUserInfoActions({ commit }) {
    const { data: userObj } = await getUserInfoAPI()
    const { data: photoObj } = await getUserPhotoAPI(userObj.userId)
    commit('SET_USER', { ...userObj, ...photoObj }) // 把用户信息对象，交到mutations里保存到userInfo上
    // 把两个对象都展开，形成一个全新的对象，传递给userInfo保存
    // 这里res.data是实参
    return userObj.roles.menus // 返回页面权限点的英文字符串数组['emplyees',...]
  },
  // 封装退出登录的逻辑(被动退出token过期/主动退出登录)
  loginoutActions({ commit }) {
    commit('REMOVE_TOKEN')
    commit('REMOVE_USER')
    // state清除，getters也受到影响
    resetRouter() // 让内存里的router对象重置
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

